/**
 * 线性伪随机算法
 * @date 2024.9.10
 * @author wz
 */
export class SeedRand {
    /**
     * 乘数
     */
    private a: number;

    /**
     * 增量
     */
    private c: number;

    /**
     * 模数
     */
    private m: number;

    /**
     * 初始值
     */
    private seed: number;

    /**
     * 构造函数
     * @param seed 初始种子值
     */
    constructor(seed: number) {
        this.a = 1664525;
        this.c = 1013904223;
        this.m = 4294967296;
        this.seed = seed;
    }

    /**
     * 使用线性同余算法生成下一个随机数 [0, 2^32)
     * @returns 下一个随机数
     */
    next(): number {
        this.seed = (this.a * this.seed + this.c) % this.m;
        return this.seed;
    }

    /**
     * 生成指定范围内的随机数
     * @param min 最小值（包含）
     * @param max 最大值（包含）
     * @returns 指定范围内的随机数
     */
    nextRange(min: number, max: number): number {
        const range = max - min + 1;
        return this.next() % range + min;
    }
}